/* Die Klasse Markierer hat die Aufgabe das gesuchte Regal 
 * farblich zu markieren. 
 * 
 * Datei: Markierer.java      Autor:   Christian Plappert
 * Datum: 03.12.2011          Version: 0.2.1
 * 
 * Historie: 
 * 
 * 03.12.2011: v0.2.1  Problem in der Markierenfunktion behoben.
 * 30.11.2011: v0.2    Funktion zum Markieren implementiert.
 * 28.11.2011: v0.1    Klasse wurde angelegt.
 * 
 */
package bibvis;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;

import javax.swing.JPanel;

import bibvis.FigurZustand;

public class Markierer extends JPanel
{
  private static final long serialVersionUID = 697704909292086157L;
  private ArrayList<FigurZustand> rechtecke;
  private HashMap<ObjektAufzaehlung, ArrayList<FigurZustand>> objekte;
  private FigurZustand rechteck;
  private int MASSSTAB;
  private static int FAKTOR = 2;


  public Markierer (ArrayList<FigurZustand> rechtecke,
    HashMap<ObjektAufzaehlung, ArrayList<FigurZustand>> objekte,
    FigurZustand rechteck, int[] groesse, int massstab)
  {
    MASSSTAB = (massstab / FAKTOR);

    setzeRechtecke (rechtecke);
    setzeObjekte (objekte);
    setzeRechteck (rechteck);
    setPreferredSize (new Dimension (groesse[0] * MASSSTAB, groesse[1]
      * MASSSTAB));
  }


  protected void paintComponent(Graphics g)
  {
    zeichne (g);
  }


  /**
   * Die Methode zeichnet sowohl die Regal, als auch die Orientierungs-
   * objekte (Fenster, Tuer, ...). Das gesuchte Regal wird anschliessend
   * rot markiert.
   * 
   * @param g
   */
  private void zeichne(Graphics g)
  {
    Iterator<FigurZustand> it;
    FigurZustand r;

    for (Entry<ObjektAufzaehlung, ArrayList<FigurZustand>> e : objekte
      .entrySet ())
    {
      for (it = objekte.get (e.getKey ()).iterator (); it.hasNext ();)
      {
	r = (FigurZustand) it.next ();
	if (r != null)
	{
	  g.setColor (Color.gray);
	  g.drawRect (r.x / FAKTOR, r.y / FAKTOR, r.width * MASSSTAB,
	    r.height * MASSSTAB);
	  g.fillRect (r.x / FAKTOR, r.y / FAKTOR, r.width * MASSSTAB,
	    r.height * MASSSTAB);
	}
      }
    }

    for (it = rechtecke.iterator (); it.hasNext ();)
    {
      r = (FigurZustand) it.next ();
      if (r != null)
      {
	g.setColor (Color.green);
	g.drawRect (r.x / FAKTOR, r.y / FAKTOR, r.width * MASSSTAB,
	  r.height * MASSSTAB);
	g.fillRect (r.x / FAKTOR, r.y / FAKTOR, r.width * MASSSTAB,
	  r.height * MASSSTAB);
      }
    }

    /*
     * Loesche gesuchtes Regal und zeichne es in der Farbe rot erneut.
     */
    r = gibRechteck ();
    g.clearRect (r.x / FAKTOR, r.y / FAKTOR, r.width * MASSSTAB,
      r.height * MASSSTAB);
    g.setColor (Color.red);
    g.drawRect (r.x / FAKTOR, r.y / FAKTOR, r.width * MASSSTAB,
      r.height * MASSSTAB);
    g.fillRect (r.x / FAKTOR, r.y / FAKTOR, r.width * MASSSTAB,
      r.height * MASSSTAB);
  }


  private FigurZustand gibRechteck()
  {
    return rechteck;
  }


  private void setzeRechteck(FigurZustand rechteck)
  {
    this.rechteck = rechteck;
  }


  private void setzeRechtecke(ArrayList<FigurZustand> figuren)
  {
    this.rechtecke = figuren;
  }


  private void setzeObjekte(
    HashMap<ObjektAufzaehlung, ArrayList<FigurZustand>> objekte)
  {
    this.objekte = objekte;
  }
}
